//
// This file is part of cpp-lib, a library of C++ functions and classes.
// Cpp-lib is copyright (C) 2004 and onwards, The CPL Interest Group.
// 
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or (at
// your option) any later version.
// 
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser
// General Public License for more details.
// 
// You should have received a copy of the GNU Lesser General Public License
// along with this library (see the file COPYING); if not, write to the
// Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
// 02111-1307  USA
//
// $Id$
//

#include <iostream>
#include <exception>
#include <stdexcept>
#include <vector>
#include <sstream>
#include <string>

#include "cpp-lib/varlist.h"
#include "cpp-lib/util.h"


using namespace cpl::util ;


int main() {
  
  try {

  std::vector< double > xs( 2 , 4711 ) ;
  long y = 815 ;

  varlist l ;
  l.vector_bind( "xs_" , xs ) ;
  l.bind( "y" , y ) ;

  std::cout << "creating xs_0 and xs_1 reference\n" ;

  double& xs_0 = l.reference< double >( "xs_0" ) ;
  double& xs_1 = l.reference< double >( "xs_1" ) ;

  xs[ 1 ] = 4712 ;

  always_assert( 4711 == xs_0 ) ;
  always_assert( 4712 == xs_1 ) ;

  std::vector< std::string > names ;
  names.push_back( "y"    ) ;
  names.push_back( "xs_1" ) ;

  std::cout << "creating stream_serializer with y and xs_1\n" ;
  stream_serializer ss( l , names ) ;
  std::ostringstream os ;
  os << ss ;
  always_assert( "815 4712" == os.str() ) ;

  std::istringstream is( std::string( "  -3 -8 " ) ) ;
  is >> ss ;
  always_assert( -3 == y       ) ;
  always_assert( -8 == xs[ 1 ] ) ;

  try {

    // reference<>() should throw a logic_error on wrong type.
    l.reference< int >( "xs_1" ) ;
    throw std::runtime_error( "varlist implementation not typesafe?" ) ;

  } catch( std::logic_error const& ) {}

  std::cout << "varlist tests OK.\n" ;
    
  } catch( std::exception const& e ) 
  { std::cerr << e.what() << std::endl ; return 1 ; }

}
